<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222"><meta name="generator" content="Hexo 7.3.0">

  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.ico">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.ico">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">



<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha256-wiz7ZSCn/btzhjKDQBms9Hx4sSeUYsDrTLg7roPstac=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancyapps-ui/5.0.28/fancybox/fancybox.css" integrity="sha256-6cQIC71/iBIYXFK+0RHAvwmjwWzkWd+r7v/BX3/vZDc=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pace/1.2.4/themes/green/pace-theme-minimal.css">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/pace/1.2.4/pace.min.js" integrity="sha256-gqd7YTjg/BtfqWSwsJOvndl0Bxc8gFImLEkXQT8+qj0=" crossorigin="anonymous"></script>

<script class="next-config" data-name="main" type="application/json">{"hostname":"sumumm.github.io","root":"/","images":"/images","scheme":"Gemini","darkmode":false,"version":"8.19.2","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":{"enable":true,"style":"mac"},"fold":{"enable":true,"height":300},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":true,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":true,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果：${query}","hits_time":"找到 ${hits} 个搜索结果（用时 ${time} 毫秒）","hits":"找到 ${hits} 个搜索结果"},"path":"/search.xml","localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false}}</script><script src="/js/config.js"></script>

    <meta name="description" content="本文主要是图片格式——JPEG编解码的相关笔记，若笔记中有错误或者不合适的地方，欢迎批评指正😃。">
<meta property="og:type" content="article">
<meta property="og:title" content="LV01-图像-03-图片格式-03-02-JPEG编解码">
<meta property="og:url" content="https://sumumm.github.io/post/23c4a364.html">
<meta property="og:site_name" content="苏木">
<meta property="og:description" content="本文主要是图片格式——JPEG编解码的相关笔记，若笔记中有错误或者不合适的地方，欢迎批评指正😃。">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240714125608418.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1d2b723cb8f96e0a7994fb49056d4227.jpeg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074019578.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/b57cc27d3960f45a413c04e69a1141aa.jpeg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/393844fa557feb50255ca5a7b4289899.jpeg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240714201221685.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074429310.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074446271.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074529288.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1350303244_2589.jpg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20241224075202047.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20241224080235458.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/3263e093fa9393626412f7e4c17dbd19.jpeg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1351305053_6905.jpg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074839085.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240719070235395.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/3017426751ef59136a7b43c7d3c0a470.jpeg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/c057bc57ddd51e372e99e083879a4bb5.jpeg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1029afa63e1dcd00acc35397e1962f90.jpeg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240719070935943.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240719071613195.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1029afa63e1dcd00acc35397e1962f90.jpeg">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20241224233702179.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240721074505981.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/2ec812eeb3a7278727eafb82ace24887.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240724073310121.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20241227080436318.png">
<meta property="article:published_time" content="2024-07-29T23:49:11.000Z">
<meta property="article:modified_time" content="2025-06-13T16:25:57.063Z">
<meta property="article:author" content="苏木">
<meta property="article:tag" content="(ALPHA)LV01-图像基础知识">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240714125608418.png">


<link rel="canonical" href="https://sumumm.github.io/post/23c4a364.html">



<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"zh-CN","comments":"","permalink":"https://sumumm.github.io/post/23c4a364.html","path":"post/23c4a364.html","title":"LV01-图像-03-图片格式-03-02-JPEG编解码"}</script>

<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>LV01-图像-03-图片格式-03-02-JPEG编解码 | 苏木</title>
  








    <script src="/js/browser_tools_disable.js"></script>

  <noscript>
    <link rel="stylesheet" href="/css/noscript.css">
  </noscript>
<!-- hexo injector head_end start --><link rel="stylesheet" href="https://unpkg.com/hexo-next-tags-plus@latest/lib/tag_plus.css" media="defer" onload="this.media='all'"><!-- hexo injector head_end end --></head>

<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
  <div class="headband"></div>

  <main class="main">
    <div class="column">
      <header class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏" role="button">
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <i class="logo-line"></i>
      <p class="site-title">苏木</p>
      <i class="logo-line"></i>
    </a>
      <p class="site-subtitle" itemprop="description">我的学习之路</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger" aria-label="搜索" role="button">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>



<nav class="site-nav">
  <ul class="main-menu menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-home fa-fw"></i>苏木的家</a></li><li class="menu-item menu-item-categories"><a href="/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类页<span class="badge">42</span></a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档页<span class="badge">673</span></a></li><li class="menu-item menu-item-flink"><a href="/flink/" rel="section"><i class="fa fa-link fa-fw"></i>友人帐</a></li><li class="menu-item menu-item-about"><a href="/about/" rel="section"><i class="fa fa-user fa-fw"></i>关于我</a></li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup"><div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off" maxlength="80"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close" role="button">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div class="search-result-container no-result">
  <div class="search-result-icon">
    <i class="fa fa-spinner fa-pulse fa-5x"></i>
  </div>
</div>

    </div>
  </div>

</header>
        
  
  <aside class="sidebar">

    <div class="sidebar-inner sidebar-nav-active sidebar-toc-active">
      <ul class="sidebar-nav">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <div class="sidebar-panel-container">
        <!--noindex-->
        <div class="post-toc-wrap sidebar-panel">
            <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%B8%80%E3%80%81%E7%BC%96%E8%A7%A3%E7%A0%81%E7%AE%80%E4%BB%8B"><span class="nav-text">一、编解码简介</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-%E7%BC%96%E8%A7%A3%E7%A0%81%E5%9F%BA%E6%9C%AC%E6%B5%81%E7%A8%8B"><span class="nav-text">1. 编解码基本流程</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-%E8%89%B2%E5%BD%A9%E6%A8%A1%E5%9E%8B%E8%BD%AC%E6%8D%A2"><span class="nav-text">2. 色彩模型转换</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-%E8%89%B2%E5%BD%A9%E6%B7%B1%E5%BA%A6-color-depth"><span class="nav-text">3. 色彩深度 color depth</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%BA%8C%E3%80%81JPEG%E7%BC%96%E7%A0%81%E5%8E%9F%E7%90%86"><span class="nav-text">二、JPEG编码原理</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-%E5%9B%BE%E5%83%8F%E5%88%86%E5%9D%97"><span class="nav-text">1. 图像分块</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-DCT-%E7%A6%BB%E6%95%A3%E4%BD%99%E5%BC%A6%E5%8F%98%E6%8D%A2"><span class="nav-text">2. DCT-离散余弦变换</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#2-1-%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86"><span class="nav-text">2.1 基本原理</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#2-2-%E5%AE%9E%E4%BE%8B1"><span class="nav-text">2.2 实例1</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#2-3-%E5%AE%9E%E4%BE%8B2"><span class="nav-text">2.3 实例2</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-%E9%87%8F%E5%8C%96"><span class="nav-text">3. 量化</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#3-1-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5"><span class="nav-text">3.1 基本概念</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#3-2-%E5%AE%9E%E4%BE%8B1"><span class="nav-text">3.2 实例1</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#3-2-%E5%AE%9E%E4%BE%8B2"><span class="nav-text">3.2 实例2</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-%E7%BC%96%E7%A0%81"><span class="nav-text">4. 编码</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#4-1-%E7%BC%96%E7%A0%81%E5%88%86%E7%B1%BB"><span class="nav-text">4.1 编码分类</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#4-1-1-%E7%9B%B4%E6%B5%81%E5%88%86%E9%87%8F%E7%9A%84%E7%BC%96%E7%A0%81"><span class="nav-text">4.1.1 直流分量的编码</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#4-1-2-%E4%BA%A4%E6%B5%81%E5%88%86%E9%87%8F%E7%9A%84%E7%BC%96%E7%A0%81"><span class="nav-text">4.1.2 交流分量的编码</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#4-2-%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8"><span class="nav-text">4.2 数据存储</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#4-3-%E8%A1%8C%E7%A8%8B%E7%BC%96%E7%A0%81%E7%AE%80%E4%BB%8B"><span class="nav-text">4.3 行程编码简介</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#4-4-%E7%86%B5%E7%BC%96%E7%A0%81"><span class="nav-text">4.4 熵编码</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#4-4-1-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5"><span class="nav-text">4.4.1 基本概念</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#4-4-2-%E5%AE%9E%E4%BE%8B1"><span class="nav-text">4.4.2 实例1</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#4-4-3-%E5%AE%9E%E4%BE%8B2"><span class="nav-text">4.4.3 实例2</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#5-%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99"><span class="nav-text">5. 参考资料</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%B8%89%E3%80%81JPEG%E8%A7%A3%E7%A0%81%E5%8E%9F%E7%90%86"><span class="nav-text">三、JPEG解码原理</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-%E8%A7%A3%E7%A0%81%E5%AE%9E%E4%BE%8B1"><span class="nav-text">1. 解码实例1</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-%E8%A7%A3%E7%A0%81%E5%AE%9E%E4%BE%8B2"><span class="nav-text">2. 解码实例2</span></a></li></ol></li></ol></div>
        </div>
        <!--/noindex-->

        <div class="site-overview-wrap sidebar-panel">
          <div class="site-author animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image" alt="苏木"
      src="/images/avatar.jpg">
  <p class="site-author-name" itemprop="name">苏木</p>
  <div class="site-description" itemprop="description">莫道桑榆晚，为霞尚满天</div>
</div>
<div class="site-state-wrap animated">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
        <a href="/archives/">
          <span class="site-state-item-count">673</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
          <a href="/categories/">
        <span class="site-state-item-count">42</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
        <span class="site-state-item-count">43</span>
        <span class="site-state-item-name">标签</span>
      </div>
  </nav>
</div>
  <div class="links-of-author animated">
      <span class="links-of-author-item">
        <a href="https://github.com/sumumm" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;sumumm" rel="noopener me" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
      </span>
  </div>

        </div>
      </div>
    </div>

    
  </aside>


    </div>

    <div class="main-inner post posts-expand">


  


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://sumumm.github.io/post/23c4a364.html">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.jpg">
      <meta itemprop="name" content="苏木">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="苏木">
      <meta itemprop="description" content="莫道桑榆晚，为霞尚满天">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="LV01-图像-03-图片格式-03-02-JPEG编解码 | 苏木">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          LV01-图像-03-图片格式-03-02-JPEG编解码
        </h1>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2024-07-30 07:49:11" itemprop="dateCreated datePublished" datetime="2024-07-30T07:49:11+08:00">2024-07-30</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/" itemprop="url" rel="index"><span itemprop="name">嵌入式开发</span></a>
        </span>
          ，
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/" itemprop="url" rel="index"><span itemprop="name">04音视频</span></a>
        </span>
          ，
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/" itemprop="url" rel="index"><span itemprop="name">LV01-图像基础知识</span></a>
        </span>
    </span>

  
    <span class="post-meta-break"></span>
    <span class="post-meta-item" title="本文字数">
      <span class="post-meta-item-icon">
        <i class="far fa-file-word"></i>
      </span>
      <span class="post-meta-item-text">本文字数：</span>
      <span>9.7k</span>
    </span>
    <span class="post-meta-item" title="阅读时长">
      <span class="post-meta-item-icon">
        <i class="far fa-clock"></i>
      </span>
      <span class="post-meta-item-text">阅读时长 &asymp;</span>
      <span>35 分钟</span>
    </span>
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody"><p>本文主要是图片格式——JPEG编解码的相关笔记，若笔记中有错误或者不合适的地方，欢迎批评指正😃。</p>
<span id="more"></span>

<!-- Photo: https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/ -->

<details class="folding-tag" blue><summary> 点击查看使用工具及版本 </summary>
              <div class='content'>
              <table>    <tr>        <td align="center" rowspan="5">PC端开发环境</td>        <td align="center" width=150px>Windows</td>        <td align="left">Windows11</td>    </tr>    <tr>        <td align="center">Ubuntu</td>        <td align="left">Ubuntu20.04.6的64位版本</td>      </tr>    <tr>        <td align="center">VMware® Workstation 17 Pro</td>        <td align="left">17.0.0 build-20800274</td>      </tr>    <tr>        <td align="center">终端软件</td>        <td align="left">MobaXterm(Professional Edition v23.0 Build 5042 (license))</td>    </tr>    <tr>        <td align="center">Win32DiskImager</td>        <td align="left">Win32DiskImager v1.0</td>      </tr>    <tr>        <td align="center" rowspan="3">Linux开发板环境</td>        <td align="center">Linux开发板</td>        <td align="left">正点原子 i.MX6ULL Linux 阿尔法开发板</td>      </tr>    <tr>        <td align="center">uboot</td>        <td align="left">NXP官方提供的uboot，NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)</td>      </tr>    <tr>        <td align="center">linux内核</td>        <td align="left">linux-4.15(NXP官方提供)</td>      </tr></table>
              </div>
            </details>

<details class="folding-tag" blue><summary> 点击查看本文参考资料 </summary>
              <div class='content'>
              <ul><li>通用</li></ul><table>    <tr><td align="center">参考资料  </td><td align="center">相关链接</td></tr>    <tr><td align="left">JPEG官网？</td><td align="left"><a href="https://jpeg.org/jpeg/index.html" target="_blank">jpeg.org<i class="fa fa-external-link-alt"></i> </a></td></tr>    <tr><td align="left" rowspan="2">JPEG文件格式参考文档</td><td align="left"><a href="https://www.ijg.org/files/T-REC-T.871-201105-I!!PDF-E.pdf" target="_blank">JPEG File Interchange Format (JFIF) ---在线文档<i class="fa fa-external-link-alt"></i> </a></td></tr>    <tr><td align="left"><a href="./参考资料/T-REC-T.871-201105-I!!PDF-E.pdf" target="_blank">JPEG File Interchange Format (JFIF) ---本地文档<i class="fa fa-external-link-alt"></i> </a></td></tr></table>
              </div>
            </details>

<details class="folding-tag" blue><summary> 点击查看相关文件下载 </summary>
              <div class='content'>
              <table>    <tr><td align="left"><a href="" target="_blank">---</a></td><td align="left">---</td></tr></table>
              </div>
            </details>

<h1 id="一、编解码简介"><a href="#一、编解码简介" class="headerlink" title="一、编解码简介"></a><font size=3>一、编解码简介</font></h1><h2 id="1-编解码基本流程"><a href="#1-编解码基本流程" class="headerlink" title="1. 编解码基本流程"></a><font size=3>1. 编解码基本流程</font></h2><img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240714125608418.png" alt="image-20240714125608418" />



<h2 id="2-色彩模型转换"><a href="#2-色彩模型转换" class="headerlink" title="2. 色彩模型转换"></a><font size=3>2. 色彩模型转换</font></h2><p>这一节笔记主要是jpeg的编码，但是还是要在这里再简单了解一下色彩模型的转换。为什么要做色彩模型转换？前面学习YUV的时候有了解过，这是因为人眼的视杆细胞（对亮度敏感）的数量远多于视锥细胞（对颜色敏感），因此适当压缩颜色信息可以有效减少数据量。</p>
<p>现在采用的色彩空间变换有三种：YIQ，YUV 和 YCrCb。每一种色彩空间都产生一种亮度分量信号和两种色度分量信号，而每一种变换使用的参数都是为了适应某种类型的显示设备。</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1d2b723cb8f96e0a7994fb49056d4227.jpeg" alt="img" />

<p>YUV 不是哪个英文单词的缩写，而只是符号，Y 表示亮度，UV 用来表示色差，U、V 是构成彩色的两个分量；YUV 表示法的重要性是它的亮度信号(Y)和色度信号(U、V)是相互独立的，也就是 Y 信号分量构成的黑白灰度图与用 U、V 信号构成的另外两幅单色图是相互独立的。由于 Y、U、V 是独立的，所以可以对这些单色图分别进行编码。此外，黑白电视能接收彩色电视信号也就是利用了 YUV 分量之间的独立性。</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074019578.png" alt="image-20240716074019578" style="zoom:50%;" />

<p>例如，要存储 RGB 8∶8∶8的彩色图像，即 R、G 和 B 分量都用8位二进制数（1个字节）表示，图像的大小为640×480像素，那么所需要的存储容量为640×480×(1+1+1)&#x3D;921 600字节，即900KB，其中(1+1+1)表示 RGB 各占一个字节。</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/b57cc27d3960f45a413c04e69a1141aa.jpeg" alt="img" />

<p>如果用 YUV411 来表示同一幅彩色图像，Y 分量仍然为640×480，并且 Y 分量仍然用8位表示，而对每四个相邻像素(2×2)的 U、V 值分别用相同的一个值表示，那么存储同样的一幅图像所需的存储空间就减少到640×480×(1+1&#x2F;(2*2)+1&#x2F;(2*2))&#x3D;460 800字节，即450KB。也就是把数据压缩了一半。</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/393844fa557feb50255ca5a7b4289899.jpeg" alt="img" />

<p>无论是用 YIQ、YUV 和 YCrCb 还是其他模型来表示的彩色图像，由于现在所有的显示器都采用 RGB 值来驱动，这就要求在显示每个像素之前，须要把彩色分量值转换成 RGB 值。在RGB和YUV怎么转换？</p>
<p>标准有BT601，BT656，BT709等，这些标准不仅包含颜色空间，还包含帧率，分辨率等内容，这里仅仅学习颜色空间的部分。那么JPEG用的是哪一个？参考<a target="_blank" rel="noopener" href="https://www.ijg.org/files/T-REC-T.871-201105-I!!PDF-E.pdf">《ITU-T T.871》</a>第7节“Conversion to and from RGB”这里说的很清楚用的是BT601，但是和BT601有一点区别，BT601的YUV取值范围是16到235，JPEG中的取值范围是0到255。书中给出的公式如下</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240714201221685.png" alt="image-20240714201221685" style="zoom:50%;" />

<p>如果在代码中使用这个公式转换色彩模型最终编码出来的JPEG图片颜色会出问题：</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">luma = <span class="number">0.299f</span>   * r + <span class="number">0.587f</span>  * g + <span class="number">0.114f</span>  * b;</span><br><span class="line">cb   = <span class="number">-0.1687f</span> * r - <span class="number">0.3313f</span> * g + <span class="number">0.5f</span>    * b + <span class="number">128.0f</span>;</span><br><span class="line">cr   = <span class="number">0.5f</span>     * r - <span class="number">0.4187f</span> * g - <span class="number">0.0813f</span> * b + <span class="number">128.0f</span>;</span><br></pre></td></tr></table></figure>

<p>使用这个公式才能得到正确的结果:</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">luma = <span class="number">0.299f</span>   * r + <span class="number">0.587f</span>  * g + <span class="number">0.114f</span>  * b - <span class="number">128</span>;</span><br><span class="line">cb   = <span class="number">-0.1687f</span> * r - <span class="number">0.3313f</span> * g + <span class="number">0.5f</span>    * b;</span><br><span class="line">cr   = <span class="number">0.5f</span>     * r - <span class="number">0.4187f</span> * g - <span class="number">0.0813f</span> * b;</span><br></pre></td></tr></table></figure>

<p>查看 《ITU-T T.81》 的 A.3.1 节“Level shift”(这里我没找到，后面找到了再补充吧)，这里提到数据需要 -2^(P-1) 的偏移，也就是说8位数据要减去128。这个看网上也可以写成矩阵的形式：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074429310.png" alt="image-20240716074429310" style="zoom: 50%;" />

<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074446271.png" alt="image-20240716074446271" style="zoom: 50%;" />

<p>其中：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074529288.png" alt="image-20240716074529288" style="zoom:50%;" />

<p>总体来说，上面了解的这些内容，主要就是对原始图片，可以先进行色彩空间的处理，使采集到的图像数据有所减少。实际上，JPEG 算法与色彩空间无关，色彩空间是涉及到图像采样的问题，它和数据的压缩并没有直接的关系。因此其实，“RGB 到 YUV 变换”和“YUV 到 RGB 变换”不包含在 JPEG 算法中。JPEG 算法处理的彩色图像是单独的彩色分量图像，因此它可以压缩来自不同色彩空间的数据，如 RGB，YcbCr 和 CMYK。</p>
<h2 id="3-色彩深度-color-depth"><a href="#3-色彩深度-color-depth" class="headerlink" title="3. 色彩深度 color depth"></a><font size=3>3. 色彩深度 color depth</font></h2><p>在图像中，它是由很多个点来组成的，那么存储每个像素点所用的位数就叫做像素深度。对一个图片，这个值是可以有所不同的，从而会使得图片的数据有多和少的区别。</p>
<p>一幅彩色图像的每个像素用 R，G，B 三个分量表示，若每个分量用8位，那么一个像素共用3X8&#x3D;24位表示，就说像素的深度为24 bit，每个像素可以是2的24次方&#x3D;16 777 216种颜色中的一种。表示一个像素的位数越多，它能表达的颜色数目就越多。</p>
<p>在用二进制数表示彩色图像的像素时，除 R，G，B 分量用固定位数表示外，往往还增加1位或几位作为属性(Attribute)位。例如，RGB 5∶5∶5表示一个像素时，用2个字节共16位表示，其中 R，G，B 各占5位，剩下一位作为属性位。在这种情况下，像素深度为16位，而图像深度为15 位。</p>
<p>在用32位表示一个像素时，若 R，G，B 分别用8位表示，剩下的8位常称为 alpha 通道(alpha channel)位，或称为覆盖(overlay)位、中断位、属性位。它的用法可用一个预乘 α 通道(premultiplied alpha)的例子说明。假如一个像素(A，R，G，B)的四个分量都用归一化的数值表示，(A，R，G，B)为(1，1，0，0)时显示红色。当像素为 (0.5，1，0，0)时，预乘的结果就变成(0.5，0.5，0，0)，这表示原来该像素显示的红色的强度为1，而现在显示的红色的强度降了一半。</p>
<p>这个 alpha 值，在这里就用来表示该像素如何产生特技效果。</p>
<p>总体来说，图像的宽高、分辨率越高，就是组成一幅图的像素越多，则图像文件越大；像素深度越深，就是表达单个像素的颜色和亮度的位数越多，图像文件就越大。</p>
<p>只有黑白两种颜色的图像称为单色图像(monochrome)，每个像素的像素值用1位存储，它的值只有“0”或者“1”，一幅640×480的单色图像需要占据37.5 KB的存储空间。</p>
<p>而灰度图像，即有色深的黑白图像，如果每个像素的像素值用一个字节表示，而不是仅仅只有一位，那么灰度值级数就等于256级，每个像素可以是0 - 255之间的任何一个值，一幅640×480的灰度图像就需要占用300 KB的存储空间，类似上面说到过的 Y 分量。</p>
<h1 id="二、JPEG编码原理"><a href="#二、JPEG编码原理" class="headerlink" title="二、JPEG编码原理"></a><font size=3>二、JPEG编码原理</font></h1><p>这里只详细学习编码过程，解码其实就是逆过程。</p>
<h2 id="1-图像分块"><a href="#1-图像分块" class="headerlink" title="1. 图像分块"></a><font size=3>1. 图像分块</font></h2><p>将原始图像分为8*8的小块, 每个block里有64pixels，每个块构成一个数据单元（DU）如下图：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1350303244_2589.jpg" alt="1350303244_2589"  />

<p>就是划分后，整个图像就是这样的：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20241224075202047.png" alt="image-20241224075202047" style="zoom:50%;" />

<p>我们知道为了降低静态图像数据量，我们可以采用YUV色彩格式，JPEG支持下面几种：</p>
<ul>
<li><p>灰度图，单分量</p>
</li>
<li><p>YUV444，采样因子水平2:2:2 垂直2:2:2</p>
</li>
<li><p>YUV422，采样因子水平2:2:2 垂直2:1:1</p>
</li>
<li><p>YUV420，采样因子水平2:1:1 垂直2:1:1</p>
</li>
</ul>
<p>那么对于YUV数据来说，并不一定是1个Y对应一个U和V，那这怎么分块?</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20241224080235458.png" alt="image-20241224080235458" style="zoom:50%;" />

<p>不管是YUV444、YVV422还是YUV420，他们进行分块的时候YUV三个分量都是按照8x8进行分块，以YUV420为例，8x8个Y数据，8x8个U数据和8x8个V数据分别构成DU(Y)、DU(U)和DU(V)。</p>
<p>但是这三种采样方式对应的最小编码单元MCU不同，因为这三种格式一个完整的像素点对应的YUV分量数是不同的。需要按照水平和垂直采样因子决定MCU格式，例如YUV420为H-2:1:1，V-2:1:1，表示Y分量2x2个DU、U分量1x1 、V分量1x1构成一个MCU。即4个DU(Y)、1个DU(U)和1个DU(V)可构成一个最小编码单元（MCU）。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Y：SHY=2    SVY=2</span><br><span class="line">U：SHU=1    SVU=1</span><br><span class="line">V：SHV=1    SVV=1</span><br></pre></td></tr></table></figure>

<p>据存放方式为</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DU(Y) DU(Y) ... DU(Y) DU(U) ... DU(U) DU(V) ... DU(V)</span><br></pre></td></tr></table></figure>

<blockquote>
<p>Tips：每16x16个像素块构成一个MCU</p>
</blockquote>
<h2 id="2-DCT-离散余弦变换"><a href="#2-DCT-离散余弦变换" class="headerlink" title="2. DCT-离散余弦变换"></a><font size=3>2. DCT-离散余弦变换</font></h2><h3 id="2-1-基本原理"><a href="#2-1-基本原理" class="headerlink" title="2.1 基本原理"></a><font size=3>2.1 基本原理</font></h3><p>将图像从色彩域转换到频率域，常用的变换方法有：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/3263e093fa9393626412f7e4c17dbd19.jpeg" alt="img" />



<p>这里我们用的是DCT离散余弦变换。和FFT一样，DCT也是将信号从时域到频域的变换，不同的是DCT中变换结果没有复数，全是实数。每8*8个original pixels都变成了另外8*8个数字，变换后的每一个数都是由original 64 data通过basis function组合而得的，如下图所示为DCT谱中6个元素的由来。</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1351305053_6905.jpg" alt="1351305053_6905" />

<p>将低频部分集中在每个8*8块的左上角，高频部分在右下角，所谓JPEG的有损压缩，损的是量化过程中的高频部分。为什么呢？因为有这样一个前提：低频部分比高频部分要重要得多，romove 50%的高频信息可能对于编码信息只损失了5%。</p>
<p>二维DCT变换公式如下：<br>$$<br>\begin{aligned}<br>F(u,v)&#x3D;c(u)c(v)\sum_{i &#x3D; 0}^{N-1}\sum_{j &#x3D; 0}^{N-1}f(i,j)cos[\frac{(2i+1)\pi}{2N}u]cos[\frac{(2j+1)\pi}{2N}v]<br>\end{aligned}<br>$$</p>
<p>$$<br>\begin{aligned}<br>f(i,j)&#x3D; \sum_{u &#x3D; 0}^{N-1}\sum_{v &#x3D; 0}^{N-1}c(u)c(v)F(u,v)cos[\frac{(2i+1)\pi}{2N}u]cos[\frac{(2j+1)\pi}{2N}v]<br>\end{aligned}<br>$$</p>
<p>$$<br>c(u) &#x3D;<br>    \begin{cases}<br>    \sqrt{\frac{1}{N}},  &amp; \text{u &#x3D; 0} \\<br>    \sqrt{\frac{2}{N}}, &amp; \text{u $\neq$ 0}<br>    \end{cases}<br>$$</p>
<p>$$<br>c(v) &#x3D;<br>    \begin{cases}<br>    \sqrt{\frac{1}{N}},  &amp; \text{v &#x3D; 0} \\<br>    \sqrt{\frac{2}{N}}, &amp; \text{v $\neq$ 0}<br>    \end{cases}<br>$$</p>
<h3 id="2-2-实例1"><a href="#2-2-实例1" class="headerlink" title="2.2 实例1"></a><font size=3>2.2 实例1</font></h3><p>来看个实例：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240716074839085.png" alt="image-20240716074839085" style="zoom:50%;" />



<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240719070235395.png" alt="image-20240719070235395" style="zoom:50%;" />

<p>对于二维灰度图像进行DCT变换，就能得到图像的频谱图：</p>
<ul>
<li><p>低阶（变化幅度小）的部分反映在DCT的左上方</p>
</li>
<li><p>高阶（变化幅度大）的部分反映在DCT的右下方。</p>
</li>
</ul>
<p>由于人眼对高阶部分不敏感，依靠低阶部分就能基本识别出图像内容，所以JPEG进行压缩的时候，基本上只存储DCT变换后的左上部分，而右下部分则直接丢弃.</p>
<h3 id="2-3-实例2"><a href="#2-3-实例2" class="headerlink" title="2.3 实例2"></a><font size=3>2.3 实例2</font></h3><p>假设8*8的原始图像如下：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/3017426751ef59136a7b43c7d3c0a470.jpeg" alt="img" />

<p>推移128后，使其范围变为 -128~127：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/c057bc57ddd51e372e99e083879a4bb5.jpeg" alt="img" />

<p>使用离散余弦变换，并四舍五入取最接近的整数：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1029afa63e1dcd00acc35397e1962f90.jpeg" alt="img" />

<p>上图就是将取样块由时间域转换为频率域的 DCT 系数块。DCT 将原始图像信息块转换成代表不同频率分量的系数集，这有两个优点：其一，信号常将其能量的大部分集中于频率域的一个小范围内，这样一来，描述不重要的分量只需要很少的比特数；其二，频率域分解映射了人类视觉系统的处理过程，并允许后继的量化过程满足其灵敏度的要求。</p>
<p>当u，v &#x3D; 0 时，离散余弦正变换（DCT）后的系数若为F(0，0)&#x3D;1，则离散余弦反变换（IDCT）后的重现函数 f(x，y)&#x3D;1&#x2F;8，是个常 数值，所以将 F(0，0) 称为直流(DC)系数；当 u，v≠0 时，正变换后的系数为 F(u，v)&#x3D;0，则反变换后的重现函数 f(x，y) 不是常数，此时 正变换后的系数 F(u，v) 为交流（AC）系数。</p>
<p>DCT 后的64个 DCT 频率系数与 DCT 前的64个像素块相对应，DCT 过程的前后都是64个点，说明这个过程只是一个没有压缩作用的无损变换过程。</p>
<p>单独一个图像的全部 DCT 系数块的频谱几乎都集中在最左上角的系数块中。</p>
<p>DCT 输出的频率系数矩阵最左上角的直流 （DC）系数幅度最大，图中为-415；以 DC 系数为出发点向下、向右的其它 DCT 系数，离 DC 分量越远，频率越高，幅度值越小，图中最右下角为2，即图像信息的大部分集中于直流系数及其附近的低频频谱上，离 DC 系数越来越远的高频频谱几乎不含图像信息，甚至于只含杂波。</p>
<p>DCT 本身虽然没有压缩作用，却为以后压缩时的”取”、”舍” 奠定了必不可少的基础。</p>
<h2 id="3-量化"><a href="#3-量化" class="headerlink" title="3. 量化"></a><font size=3>3. 量化</font></h2><h3 id="3-1-基本概念"><a href="#3-1-基本概念" class="headerlink" title="3.1 基本概念"></a><font size=3>3.1 基本概念</font></h3><p>量化过程实际上就是对 DCT 系数的一个优化过程。它是利用了人眼对高频部分不敏感的特性来实现数据的大幅简化。量化过程实际上是简单地把频率领域上每个成份，除以一个对于该成份的常数，且接着四舍五入取最接近的整数。这是整个过程中的<strong>主要有损运算</strong>。以这个结果来说，经常会把很多高频率的成份四舍五入而接近0，且剩下很多会变成小的正或负数。整个量化的目的是减小非“0”系数的幅度以及增加“0”值系数的数目。</p>
<blockquote>
<p>量化是图像质量下降的最主要原因。</p>
</blockquote>
<h3 id="3-2-实例1"><a href="#3-2-实例1" class="headerlink" title="3.2 实例1"></a><font size=3>3.2 实例1</font></h3><img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240719070935943.png" alt="image-20240719070935943" />

<p>DQT变换后左上角值表明了该分块的平均值，通常被称为直流分量，其余的63个值为交流分量</p>
<h3 id="3-2-实例2"><a href="#3-2-实例2" class="headerlink" title="3.2 实例2"></a><font size=3>3.2 实例2</font></h3><p>对于《2. DCT-离散余弦变换》中的实例2，这里也进行一个量化的说明。因为人眼对亮度信号比对色差信号更敏感，因此使用了两种量化表：亮度量化值和色差量化值。</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240719071613195.png" alt="image-20240719071613195" style="zoom:50%;" />

<p>使用这个量化矩阵与前面所得到的 DCT 系数矩阵：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/1029afa63e1dcd00acc35397e1962f90.jpeg" alt="img" />

<p>如，使用−415（DC系数）且四舍五入得到最接近的整数：<br>$$<br>[(\frac{-415}{16})]&#x3D;[-25.9375]&#x3D;-26<br>$$<br>公式中的<code>[]</code>表示取整运算。总体上来说，DCT 变换实际是空间域的低通滤波器。对 Y 分量采用细量化，对 UV 采用粗量化。量化表是控制 JPEG 压缩比的关键，这个步骤除掉了一些高频量；另一个重要原因是所有图片的点与点之间会有一个色彩过渡的过程，大量的图像信息被包含在低频率中，经过量化处理后，在高频率段，将出现大量连续的零。</p>
<h2 id="4-编码"><a href="#4-编码" class="headerlink" title="4. 编码"></a><font size=3>4. 编码</font></h2><h3 id="4-1-编码分类"><a href="#4-1-编码分类" class="headerlink" title="4.1 编码分类"></a><font size=3>4.1 编码分类</font></h3><p>有两类数据需要做编码，直流分量和交流分量。</p>
<h4 id="4-1-1-直流分量的编码"><a href="#4-1-1-直流分量的编码" class="headerlink" title="4.1.1 直流分量的编码"></a><font size=3>4.1.1 直流分量的编码</font></h4><p>编码信息分两类，一类是每个8*8格子F中的[0,0]位置上元素，这是<strong>DC</strong>（直流分量），代表8*8个子块的平均值，JPEG中对F[0,0]单独编码，由于系数的数值比较大，两个相邻的8*8子块的DC系数相差很小，所以对它们采用<a target="_blank" rel="noopener" href="http://en.wikipedia.org/wiki/Delta_encoding">差分编码DPCM(Difference Pulse Code Modulation)</a>，可以提高压缩比，也就是说对相邻的DU子块DC系数的差值进行编码，对差值进行编码所需要的位数会比对原值进行编码所需要的位数少了很多。假设某一个8*8图像块的DC系数值为15，而上一个8*8图像块的DC系数为12，则两者之间的差值为3。</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20241224233702179.png" alt="image-20241224233702179" style="zoom:67%;" />

<blockquote>
<p>Tips：JPEG对直流分量采用差分编码的形式处理，后一个DU块的直流分量只记录与前一个DU块直流分量的差值</p>
</blockquote>
<h4 id="4-1-2-交流分量的编码"><a href="#4-1-2-交流分量的编码" class="headerlink" title="4.1.2 交流分量的编码"></a><font size=3>4.1.2 交流分量的编码</font></h4><p>另一类是8*8块的其它63个子块，即交流(<strong>AC</strong>)系数，采用 <a target="_blank" rel="noopener" href="http://en.wikipedia.org/wiki/Run-length_encoding">行程编码（游程编码Run-length encode,RLE）</a>。这里出现一个问题：这63个系数应该按照怎么样的顺序排列？为了保证低频分量先出现，高频分量后出现，以增加行程中连续“0”的个数，这63个元素采用了“之”字型(<strong>Zig-Zag</strong>)的<strong>排列方法</strong>，如下图所示。</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240721074505981.png" alt="image-20240721074505981" style="zoom:50%;" />

<blockquote>
<p>为什么要进行Zig-Zag变换？</p>
<p>答：会连续出现多个0，这样很有利于使用简单而直观的行程编码(RLE：Run Length Coding)对它们进行编码。</p>
</blockquote>
<p>量化之后的数据交流分量大部分值都趋近于0，经过Zig-Zag变换后，数据中存在大量连续的0，非常适合采用RLE编码提高压缩率。</p>
<h3 id="4-2-数据存储"><a href="#4-2-数据存储" class="headerlink" title="4.2 数据存储"></a><font size=3>4.2 数据存储</font></h3><p>JPEG在进行数据存储的过程中，不直接存储数值，而是按照二进制数值+数值比特数的方式表达，例如</p>
<ul>
<li>3会表达成2-11b，其中2表示占用2个bit，值为二进制11；</li>
<li>-6表示为3-001b，负数表达方式为取反的正数对应的二进制数值取反，-6的正数为6，二进制为110b，取反就是001b。</li>
</ul>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/2ec812eeb3a7278727eafb82ace24887.png" alt="img" />

<p>这个表可以暂时称为VLI（Variable-length Code）表。</p>
<h3 id="4-3-行程编码简介"><a href="#4-3-行程编码简介" class="headerlink" title="4.3 行程编码简介"></a><font size=3>4.3 行程编码简介</font></h3><p>Run Length Encoding，行程编码又称“运行长度编码”或“游程编码”，它是一种无损压缩编码。用于更进一步降低数据的传输量。利用该编码方式，可以将一个字符串中重复出现的连续字符用两个字节来代替，其中，第一个字节代表重复的次数，第二个字节代表被重复的字符串。</p>
<p>举例来说，一组资料串”AAAABBBCCDEEEE”，由4个A、3个B、2个C、1个D、4个E组成，经过<strong>变动长度编码法</strong>可将资料压缩为4A3B2C1D4E（由14个单位转成10个单位）。</p>
<p>简言之，其优点在于将重复性高的资料量压缩成小单位；然而，其缺点在于：若该资料出现频率不高，可能导致压缩结果资料量比原始资料大，例如：原始资料”ABCDE”，压缩结果为”1A1B1C1D1E”（由5个单位转成10个单位）。</p>
<p>在JPEG编码中，假设RLC编码之后得到了一个（M,N）的数据对，其中M是两个非零AC系数之间连续的0的个数（即，行程长度），N是下一个非零的AC系数的值。采用这样的方式进行表示，是因为AC系数当中有大量的0，而采用Zig-zag扫描也会使得AC系数中有很多连续的0的存在，如此一来，便非常适合于用RLE进行编码。对经过“Z”字形编排过的数据，即可以用行程编码来对其进行大幅度的数据压缩。</p>
<p>我们来用一个简单的例子来详细说明一下：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">57，45，0，0，0，0，23，0，-30，-16，0，0，1，0，0，0，0 ，0 ，0 ，0，...，0</span><br></pre></td></tr></table></figure>

<p>可以表示为</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-16) ; (2,1) ; (0,0)</span><br></pre></td></tr></table></figure>

<p>即每组数字的头一个表示0的个数，而且为了能更有利于后续的处理，必须是 4 bit，就是说，只能是 0~15，这是的这个行程编码的一个特点。如果AC系数之间连续0的个数超过16，则用一个扩展字节(15,0)来表示16连续的0。</p>
<blockquote>
<p>AC系数的中间格式</p>
<p>根据前面提到的数据存储表格，对于前面的字符串：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-16) ; (2,1) ; (0,0)</span><br></pre></td></tr></table></figure>

<p>只处理每对数右边的那个数据，对其进行编码，查找上面的数据存储编码表格，可以发现，57在第6组当中，因此，可以将其写成(0,6),57的形式，该形式，称之为AC系数的中间格式。同样的(0,45)的中间格式为：(0,6),45；(1,-30)的中间格式为：(1,5),-30；</p>
</blockquote>
<blockquote>
<p>我们再来看一个例子帮助理解：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">假如</span><br><span class="line">（1）</span><br><span class="line">   DU数据为:5, -3, 2, 0, 0, 0, 1, 0, 0, 0, 2,其余为0</span><br><span class="line"> 对非0值编码:3-101b, 2-00b, 2-10b, 0, 0, 0, 1-1b, 0, 0, 0, 2-10b,其余为0</span><br><span class="line">    RLE编码:3-101b, (0,2)-00b, (0,2)-10b, (3,1)-1b, (3, 2)-10b, (EOB)</span><br><span class="line">       组合:(0x3)-101b, (0x02)-00b, (0x02)-10b, (0x31)-1b, (0x32)-10b,(0x00)</span><br><span class="line">(2) </span><br><span class="line">     DU数据： 2, 3, 0, -1, 0, 0, 4, 其余为0</span><br><span class="line"> 对非0值编码：2-10b, 2-11b, 0, 1-0b, 0, 0, 3-100b, 其余为0</span><br><span class="line">    RLE编码：2-10b, (0,2)-11b, (1,1)-0b, (2,3)-100b, (EOB)</span><br><span class="line">       组合：(0x2)-10b, (0x02)-11b, (0x11)-0b, (0x23)-100b, (0x00)</span><br><span class="line"></span><br></pre></td></tr></table></figure>
</blockquote>
<h3 id="4-4-熵编码"><a href="#4-4-熵编码" class="headerlink" title="4.4 熵编码"></a><font size=3>4.4 熵编码</font></h3><h4 id="4-4-1-基本概念"><a href="#4-4-1-基本概念" class="headerlink" title="4.4.1 基本概念"></a><font size=3>4.4.1 基本概念</font></h4><p>在得到DC系数的中间格式和AC系数的中间格式之后，为进一步压缩图象数据，有必要对两者进行熵编码。JPEG标准具体规定了两种熵编码方式：范数Huffman编码和算术编码。JPEG基本系统规定采用范数Huffman编码（因为不存在专利问题），但JPEG标准并没有限制JPEG算法必须用Huffman编码方式或者算术编码方式。</p>
<p>范数Huffman 编码即 Canonical Huffman Code，现在流行的很多压缩方法都使用了范式哈夫曼编码技术，如 GZIB、ZLIB、PNG、JPEG、MPEG 等。</p>
<p>范数Huffman编码有如下特性：</p>
<ul>
<li><p>码字从0开始</p>
</li>
<li><p>码字按照码字长度，由短到长排列</p>
</li>
<li><p>相同长度的码字依次递增</p>
</li>
<li><p>较长的码字，由前一长度最后一个码字+1后，乘2的位数差值次幂生成</p>
</li>
</ul>
<p>范数Huffman 编码可以通过查表完成，如下图：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20240724073310121.png" alt="image-20240724073310121" />

<h4 id="4-4-2-实例1"><a href="#4-4-2-实例1" class="headerlink" title="4.4.2 实例1"></a><font size=3>4.4.2 实例1</font></h4><p>我们来看一个实例，还是上一节的一个：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">     组合: (0x3)-101b, (0x02)-00b, (0x02)-10b, (0x31)-1b, (0x32)-10b, (0x00)</span><br><span class="line">   熵编码: (100b)-101b, (011b)-00b, (011b)-10b, (11100b)-1b, (111111001b)-10b, (010b)</span><br><span class="line">输出比特流: 100 101,011 00,011 10,11100 1,111111001 10,010,共36bit(逗号是为了分段，实际没有)</span><br></pre></td></tr></table></figure>

<h4 id="4-4-3-实例2"><a href="#4-4-3-实例2" class="headerlink" title="4.4.3 实例2"></a><font size=3>4.4.3 实例2</font></h4><p>再来看一个实例吧，帮助理解。下表是例子所用的AC系数的Huffman表，这里并不是很全，网上搜一下就有很全的了。</p>
<table>
<thead>
<tr>
<th><strong>run&#x2F;size value (RSV)</strong></th>
<th><strong>VLC length</strong></th>
<th><strong>Variable-length Code (VLC)</strong></th>
<th><strong>run&#x2F;size value (RSV)</strong></th>
<th><strong>VLC length</strong></th>
<th><strong>Variable-length Code (VLC)</strong></th>
</tr>
</thead>
<tbody><tr>
<td>0&#x2F;1</td>
<td>2</td>
<td>00</td>
<td>3&#x2F;2</td>
<td>9</td>
<td>111110111</td>
</tr>
<tr>
<td>0&#x2F;2</td>
<td>2</td>
<td>01</td>
<td>8&#x2F;1</td>
<td>9</td>
<td>111111000</td>
</tr>
<tr>
<td>0&#x2F;3</td>
<td>3</td>
<td>100</td>
<td>9&#x2F;1</td>
<td>9</td>
<td>111111001</td>
</tr>
<tr>
<td>0&#x2F;0</td>
<td>4</td>
<td>1010</td>
<td>A&#x2F;1</td>
<td>9</td>
<td>111111010</td>
</tr>
<tr>
<td>0&#x2F;4</td>
<td>4</td>
<td>1011</td>
<td>0&#x2F;8</td>
<td>10</td>
<td>1111110110</td>
</tr>
<tr>
<td>1&#x2F;1</td>
<td>4</td>
<td>1100</td>
<td>2&#x2F;3</td>
<td>10</td>
<td>1111110111</td>
</tr>
<tr>
<td>0&#x2F;5</td>
<td>5</td>
<td>11010</td>
<td>4&#x2F;2</td>
<td>10</td>
<td>1111111000</td>
</tr>
<tr>
<td>1&#x2F;2</td>
<td>5</td>
<td>11011</td>
<td>B&#x2F;1</td>
<td>10</td>
<td>1111111001</td>
</tr>
<tr>
<td>2&#x2F;1</td>
<td>5</td>
<td>11100</td>
<td>C&#x2F;1</td>
<td>10</td>
<td>1111111010</td>
</tr>
<tr>
<td>3&#x2F;1</td>
<td>6</td>
<td>111010</td>
<td>1&#x2F;5</td>
<td>11</td>
<td>11111110110</td>
</tr>
<tr>
<td>4&#x2F;1</td>
<td>6</td>
<td>111011</td>
<td>5&#x2F;2</td>
<td>11</td>
<td>11111110111</td>
</tr>
<tr>
<td>0&#x2F;6</td>
<td>7</td>
<td>1111000</td>
<td>D&#x2F;1</td>
<td>11</td>
<td>11111111000</td>
</tr>
<tr>
<td>1&#x2F;3</td>
<td>7</td>
<td>1111001</td>
<td>F&#x2F;0</td>
<td>11</td>
<td>11111111001</td>
</tr>
<tr>
<td>5&#x2F;1</td>
<td>7</td>
<td>1111010</td>
<td>2&#x2F;4</td>
<td>12</td>
<td>111111110100</td>
</tr>
<tr>
<td>6&#x2F;1</td>
<td>7</td>
<td>1111011</td>
<td>3&#x2F;3</td>
<td>12</td>
<td>111111110101</td>
</tr>
<tr>
<td>0&#x2F;7</td>
<td>8</td>
<td>11111000</td>
<td>6&#x2F;2</td>
<td>12</td>
<td>111111110110</td>
</tr>
<tr>
<td>2&#x2F;2</td>
<td>8</td>
<td>11111001</td>
<td>7&#x2F;2</td>
<td>12</td>
<td>111111110111</td>
</tr>
<tr>
<td>7&#x2F;1</td>
<td>8</td>
<td>11111010</td>
<td>8&#x2F;2</td>
<td>15</td>
<td>111111111000000</td>
</tr>
<tr>
<td>1&#x2F;4</td>
<td>9</td>
<td>111110110</td>
<td>the rest 125 VLCs</td>
<td>16</td>
<td>···</td>
</tr>
</tbody></table>
<p>假设一个图像块经过量化以后得到以下的系数矩阵：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">15 0 -1 0 0 0 0 0</span><br><span class="line">-2 -1 0 0 0 0 0 0</span><br><span class="line">-1 -1 0 0 0 0 0 0</span><br><span class="line"> 0  0 0 0 0 0 0 0</span><br><span class="line"> 0  0 0 0 0 0 0 0</span><br><span class="line"> 0  0 0 0 0 0 0 0</span><br><span class="line"> 0  0 0 0 0 0 0 0</span><br><span class="line"> 0  0 0 0 0 0 0 0</span><br></pre></td></tr></table></figure>

<p>显然，DC系数为15，假设前一个8*8的图像块的DC系数量化值为12，则当前DC系统同上一个DC系数之间的差值为3，通过查找VLI编码表，可以得到DC系数的中间格式为（2）（3），这里的2代表后面的数字（3）的编码长度为2位；</p>
<p>之后，通过Zig-zag扫描之后，遇到第一个非0的AC系数为-2，遇到0的个数为1，AC系数经过RLC编码后可表示为（1，-2），通过查找VLI表发现，-2在第2组，因此，该AC系数的中间格式为（1,2）-2；</p>
<p>其余的点类似，可以求得这个8*8子块熵编码的中间格式为</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">（DC）（2）（3）；AC（1，2）（-2），（0，1）（-1），（0，1）（-1），（0，1）（-1），（2，1）（-1），（EOB）（0，0）</span><br></pre></td></tr></table></figure>

<p>对于DC系数的中间格式(2)(3)而言，数字2查DC亮度Huffman表得到011，数字3通过查找VLI编码表得到其被编码为11；</p>
<p>对于AC系数的中间格式(1,2)(-2)而言，(1,2)查AC亮度Huffman表得到11011，-2通过查找VLI编码表得到其被编码为01；</p>
<p>对于AC系数的中间格式(0,1)(-1)而言，(0,1)查AC亮度Huffman表得到00，数字-1通过查找VLI编码表得到其被编码为0；</p>
<p>对于AC系数的中间格式(2,1)(1)而言，（2,1）查AC亮度Huffman表得到11100，数字-1通过查找VLI编码表得到其被编码为0；</p>
<p>对于AC系数的中间格式(0,0)而言，查AC亮度Huffman表得到1010；</p>
<p>因此，最后这个8*8子块亮度信息压缩后的数据流为</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">01111，1101101，000，000，000，111000，1010</span><br></pre></td></tr></table></figure>

<p>总共31比特，其压缩比是64*8&#x2F;31&#x3D;16.5，大约每个像素用半个比特。</p>
<h2 id="5-参考资料"><a href="#5-参考资料" class="headerlink" title="5. 参考资料"></a><font size=3>5. 参考资料</font></h2><ul>
<li><p><a target="_blank" rel="noopener" href="https://github.com/xnvi/learn-jpeg-encode">GitHub - xnvi&#x2F;learn-jpeg-encode: 以学习为目的编写的简易jpeg编码器，以看得懂为目标，代码尽可能清晰简洁，不对内存、性能做优化。</a></p>
</li>
<li><p><a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_44862382/article/details/116541216">JPEG图像编码（详细过程）_jpeg编码过程-CSDN博客</a></p>
</li>
<li><p><a target="_blank" rel="noopener" href="https://blog.csdn.net/han2529386161/article/details/109777211">JPEG 原理详细分析_jpeg编码原理-CSDN博客</a></p>
</li>
<li><p><a target="_blank" rel="noopener" href="https://www.ijg.org/files/T-REC-T.871-201105-I!!PDF-E.pdf">T-REC-T.871-201105-I!!PDF-E.pdf (ijg.org)</a></p>
</li>
<li><p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/stnlcd/p/7261862.html">JPEG压缩原理与DCT离散余弦变换——有实际的数据演示 - STN_LCD - 博客园 (cnblogs.com)</a></p>
</li>
</ul>
<h1 id="三、JPEG解码原理"><a href="#三、JPEG解码原理" class="headerlink" title="三、JPEG解码原理"></a><font size=3>三、JPEG解码原理</font></h1><h2 id="1-解码实例1"><a href="#1-解码实例1" class="headerlink" title="1. 解码实例1"></a><font size=3>1. 解码实例1</font></h2><p>解码就是一个逆过程，这里不详细去了解了，以上面这组数据为例：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">     组合: (0x3)-101b, (0x02)-00b, (0x02)-10b, (0x31)-1b, (0x32)-10b, (0x00)</span><br><span class="line">   熵编码: (100b)-101b, (011b)-00b, (011b)-10b, (11100b)-1b, (111111001b)-10b, (010b)</span><br><span class="line">输出比特流: 100 101 011 00 011 10 11100 1 111111001 10 010,共36bit</span><br></pre></td></tr></table></figure>

<p>大概流程就是：</p>
<p>1、解码直流分量，解熵编码，从Huffman表第一个长度2bit开始，读入2bit-10b</p>
<p>2、10b表中没有记录，读入下一长度3bit-100b，查找100b对应的码字为0x3</p>
<p>3、继续读取3bit101b，转换成数值为5</p>
<p>4、解码交流分量，解熵编码，得到熵解码结果0x02，高4bit为0，表明前面没有0，低4bit为2，表明后面数值位数为2，读取2bit-00b，转换后值为-3</p>
<p>5、依次解码知道遇到EOB符号结束，后续的交流分量补0。</p>
<h2 id="2-解码实例2"><a href="#2-解码实例2" class="headerlink" title="2. 解码实例2"></a><font size=3>2. 解码实例2</font></h2><img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/04%E9%9F%B3%E8%A7%86%E9%A2%91/LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/LV01-%E5%9B%BE%E5%83%8F-03-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F-03-02-JPEG%E7%BC%96%E8%A7%A3%E7%A0%81/img/image-20241227080436318.png" alt="image-20241227080436318" />


    </div>

    
    
    

    <footer class="post-footer">




    <div>
        
            <div style="text-align:center;color: #ccc;font-size:14px;">
            ----------本文结束
            <i class="fas fa-fan fa-spin" style="color: #FF1493; font-size: 1rem"></i>
            感谢您的阅读----------
            </div>
        
    </div>





  
  <div class="my_post_copyright"> 
    <p><span>文章标题:</span><a href="/post/23c4a364.html">LV01-图像-03-图片格式-03-02-JPEG编解码</a></p>
    <p><span>文章作者:</span><a href="/" title="欢迎访问 《苏木》 的学习笔记">苏木</a></p>
    <p><span>发布时间:</span>2024年07月30日 - 07:49</p>
    <p><span>最后更新:</span>2025年06月14日 - 00:25</p>
    <p><span>原始链接:</span><a href="/post/23c4a364.html" title="LV01-图像-03-图片格式-03-02-JPEG编解码">https://sumumm.github.io/post/23c4a364.html</a></p>
    <p><span>许可协议:</span><i class="fab fa-creative-commons"></i> <a rel="license" href= "https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank" title="Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)">署名-非商业性使用-禁止演绎 4.0 国际</a> 转载请保留原文链接及作者。</p>  
  </div>
  


          <div class="post-tags">
              <a href="/tags/ALPHA-LV01-%E5%9B%BE%E5%83%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/" rel="tag"><i class="fa fa-tag"></i> (ALPHA)LV01-图像基础知识</a>
          </div>

        

          <div class="post-nav">
            <div class="post-nav-item">
                <a href="/post/209e45b7.html" rel="prev" title="LV01-图像-03-图片格式-03-03-JPEG协议介绍">
                  <i class="fa fa-angle-left"></i> LV01-图像-03-图片格式-03-03-JPEG协议介绍
                </a>
            </div>
            <div class="post-nav-item">
                <a href="/post/e2674d7e.html" rel="next" title="LV01-图像-03-图片格式-03-01-JPEG基础">
                  LV01-图像-03-图片格式-03-01-JPEG基础 <i class="fa fa-angle-right"></i>
                </a>
            </div>
          </div>
    </footer>
  </article>
</div>






</div>
  </main>

  <footer class="footer">
    <div class="footer-inner">

  <div class="copyright">
    &copy; 2017 – 
    <span itemprop="copyrightYear">2025</span>
    <span class="with-love">
      <i class="fa fa-heart"></i>
    </span>
    <span class="author" itemprop="copyrightHolder">苏木</span>
  </div>
<div class="wordcount">
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-chart-line"></i>
    </span>
      <span>站点总字数：</span>
    <span title="站点总字数">3.7m</span>
  </span>
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-coffee"></i>
    </span>
      <span>站点阅读时长 &asymp;</span>
    <span title="站点阅读时长">225:26</span>
  </span>
</div>




    <span id="sitetime"></span>
    <script defer language=javascript>
        function siteTime()
        {
            window.setTimeout("siteTime()", 1000);
            var seconds = 1000;
            var minutes = seconds * 60;
            var hours = minutes * 60;
            var days = hours * 24;
            var years = days * 365;
            var today = new Date();
            var todayYear = today.getFullYear();
            var todayMonth = today.getMonth()+1;
            var todayDate = today.getDate();
            var todayHour = today.getHours();
            var todayMinute = today.getMinutes();
            var todaySecond = today.getSeconds();
            /*==================================================
            Date.UTC() -- 返回date对象距世界标准时间(UTC)1970年1月1日午夜之间的毫秒数(时间戳)
            year        - 作为date对象的年份，为4位年份值
            month       - 0-11之间的整数，做为date对象的月份
            day         - 1-31之间的整数，做为date对象的天数
            hours       - 0(午夜24点)-23之间的整数，做为date对象的小时数
            minutes     - 0-59之间的整数，做为date对象的分钟数
            seconds     - 0-59之间的整数，做为date对象的秒数
            microseconds - 0-999之间的整数，做为date对象的毫秒数
            ==================================================*/
            var t1 = Date.UTC(2017, 
                              5, 
                              19, 
                              0, 
                              0, 
                              0); //北京时间
            var t2 = Date.UTC(todayYear,todayMonth,todayDate,todayHour,todayMinute,todaySecond);
            var diff = t2-t1;
            var diffYears = Math.floor(diff/years);
            var diffDays = Math.floor((diff/days)-diffYears*365);
            var diffHours = Math.floor((diff-(diffYears*365+diffDays)*days)/hours);
            var diffMinutes = Math.floor((diff-(diffYears*365+diffDays)*days-diffHours*hours)/minutes);
            var diffSeconds = Math.floor((diff-(diffYears*365+diffDays)*days-diffHours*hours-diffMinutes*minutes)/seconds);
            document.getElementById("sitetime").innerHTML="已在这里 "+diffYears+" 年 "+diffDays+" 天 "+diffHours+" 小时 "+diffMinutes+" 分钟 "+diffSeconds+" 秒";
        }
        siteTime();
    </script>



    </div>
  </footer>

  
  <div class="back-to-top" role="button" aria-label="返回顶部">
    <i class="fa fa-arrow-up fa-lg"></i>
    <span>0%</span>
  </div>
  <div class="reading-progress-bar"></div>

<noscript>
  <div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>


  
  <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/next-theme-pjax/0.6.0/pjax.min.js" integrity="sha256-vxLn1tSKWD4dqbMRyv940UYw4sXgMtYcK6reefzZrao=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/fancyapps-ui/5.0.28/fancybox/fancybox.umd.js" integrity="sha256-ytMJGN3toR+a84u7g7NuHm91VIR06Q41kMWDr2pq7Zo=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/lozad.js/1.16.0/lozad.min.js" integrity="sha256-mOFREFhqmHeQbXpK2lp4nA3qooVgACfh88fpJftLBbc=" crossorigin="anonymous"></script>
<script src="/js/comments.js"></script><script src="/js/utils.js"></script><script src="/js/motion.js"></script><script src="/js/next-boot.js"></script><script src="/js/pjax.js"></script>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/hexo-generator-searchdb/1.4.1/search.js" integrity="sha256-1kfA5uHPf65M5cphT2dvymhkuyHPQp5A53EGZOnOLmc=" crossorigin="anonymous"></script>
<script src="/js/third-party/search/local-search.js"></script>




  <script src="/js/third-party/fancybox.js"></script>

  <script src="/js/third-party/pace.js"></script>


  




  

  <script class="next-config" data-name="enableMath" type="application/json">true</script><script class="next-config" data-name="mathjax" type="application/json">{"enable":true,"tags":"none","js":{"url":"https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.js","integrity":"sha256-MASABpB4tYktI2Oitl4t+78w/lyA+D7b/s9GEP0JOGI="}}</script>
<script src="/js/third-party/math/mathjax.js"></script>


 
        <div id="click-show-text"
            data-mobile = false
            data-text = 富强,民主,文明,和谐,自由,平等,公正,法制,爱国,敬业,诚信,友善
            data-fontsize = 15px
            data-random= false>
        </div>
       

      
        <script async src=https://cdn.jsdelivr.net/npm/hexo-next-mouse-effect@latest/click/showText.js></script>
      

      
    




    <script async src="/js/fancybox_param.js"></script>





<!-- APlayer本体 -->



</body>
</html>
